gusucode.com > 各种VC自绘控件源码程序 > 各种VC自绘控件源码/code/SkinControls(自绘MFC基本控件 )/SkinControls/SkinControls/SkinCheckBox.cpp
#include "stdafx.h" #include "SkinCheckBox.h" IMPLEMENT_DYNAMIC(CSkinCheckBox, CButton) BEGIN_MESSAGE_MAP(CSkinCheckBox, CButton) ON_WM_CREATE() ON_CONTROL_REFLECT_EX(BN_CLICKED, OnClicked) ON_WM_ERASEBKGND() ON_WM_CTLCOLOR_REFLECT() END_MESSAGE_MAP() ////////////////////////////////////////////////////////////////////////// CSkinCheckBox::CSkinCheckBox() { m_bChecked = FALSE; m_crTextColor = RGB(0,0,0); m_crBack = RGB(255,255,255); m_bSetBack = false; } CSkinCheckBox::~CSkinCheckBox() { } void CSkinCheckBox::PreSubclassWindow() { CButton::PreSubclassWindow(); ModifyStyle(0, BS_OWNERDRAW); //ModifyStyleEx(0, WS_EX_TRANSPARENT); } //建立消息 int CSkinCheckBox::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (__super::OnCreate(lpCreateStruct)==-1) return -1; ModifyStyle(0, BS_OWNERDRAW); //ModifyStyleEx(0, WS_EX_TRANSPARENT); return 0; } HBRUSH CSkinCheckBox::CtlColor(CDC* pDC, UINT nCtlColor) { pDC->SetBkMode(TRANSPARENT); return (HBRUSH)GetStockObject(NULL_BRUSH); } void CSkinCheckBox::DrawItem(LPDRAWITEMSTRUCT lpDIS) { CDC* pDC = CDC::FromHandle(lpDIS->hDC); CRect rcItem(lpDIS->rcItem); if (m_bSetBack) { pDC->FillSolidRect(&rcItem, m_crBack); m_ImageBack.Draw(pDC->m_hDC, rcItem.left, rcItem.top); } int nCheckWidth = (int)m_ImageCheck.GetWidth()/4; int nCheckHeight = (int)m_ImageCheck.GetHeight(); if (m_bChecked && this->IsWindowEnabled()) m_ImageCheck.Draw(pDC->m_hDC, rcItem.left, rcItem.Height()/2-nCheckHeight/2, nCheckWidth,nCheckHeight, 2*nCheckWidth, 0, nCheckWidth,nCheckHeight); else if (!this->IsWindowEnabled() && m_bChecked) m_ImageCheck.Draw(pDC->m_hDC, rcItem.left, rcItem.Height()/2-nCheckHeight/2, nCheckWidth,nCheckHeight, 3*nCheckWidth, 0, nCheckWidth,nCheckHeight); else if (this->IsWindowEnabled() && !m_bChecked) m_ImageCheck.Draw(pDC->m_hDC, rcItem.left, rcItem.Height()/2-nCheckHeight/2, nCheckWidth,nCheckHeight, 0, 0, nCheckWidth,nCheckHeight); else if (!this->IsWindowEnabled() && !m_bChecked) m_ImageCheck.Draw(pDC->m_hDC, rcItem.left, rcItem.Height()/2-nCheckHeight/2, nCheckWidth,nCheckHeight, nCheckWidth, 0, nCheckWidth,nCheckHeight); CString strText; GetWindowText(strText); CFont font; font.CreateFont(-12,0,0,0,400,0,0,0,134,3,2,1,2,TEXT("宋体")); pDC->SelectObject(&font); pDC->SetTextColor(m_crTextColor); pDC->TextOut(nCheckWidth+4, rcItem.Height()/2-nCheckHeight/2+1, strText); } void CSkinCheckBox::SetCheckBoxTextColor(COLORREF crTextColor) { m_crTextColor = crTextColor; } void CSkinCheckBox::SetCheckImage(HRSRC hRes, DWORD imagetype, HMODULE hModule) { //加载位图 m_ImageCheck.LoadResource(hRes, imagetype, hModule); m_ImageCheck.SetTransIndex(0); m_ImageCheck.SetTransColor(CxImage::RGBtoRGBQUAD(TRANS_COLOR)); } void CSkinCheckBox::SetCheckImage(LPCTSTR pszFileName, DWORD imagetype) { //效验参数 ASSERT(pszFileName); if (pszFileName==NULL) return ; //加载位图 m_ImageCheck.Load(pszFileName,imagetype); m_ImageCheck.SetTransIndex(0); m_ImageCheck.SetTransColor(CxImage::RGBtoRGBQUAD(TRANS_COLOR)); } void CSkinCheckBox::SetBackImage(LPCTSTR pszFileName, DWORD imagetype) { //效验参数 ASSERT(pszFileName); if (pszFileName==NULL) return ; //加载位图 m_bSetBack = true; m_ImageBack.Load(pszFileName,imagetype); SetWindowPos(NULL, 0, 0, m_ImageBack.GetWidth(), m_ImageBack.GetHeight(), SWP_NOMOVE); } BOOL CSkinCheckBox::OnClicked() { if (!m_bChecked) m_bChecked = TRUE; else m_bChecked = FALSE; RedrawWindow(); return FALSE; } BOOL CSkinCheckBox::OnEraseBkgnd(CDC* pDC) { return TRUE; } //////////////////////////////////////////////////////////////////////////